package com.fmc123.base.service;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.fmc123.base.pesistence.Page;
import com.fmc123.base.pesistence.Parameter;
import com.fmc123.base.pesistence.SimpleHibernateDao;

/**
 * 
* @ClassName: BaseService
* @Description: service基础类 
* @author fmc
* @date 2015年9月13日上午10:17:49
*
 */
@Service
@Transactional(readOnly=true)
public abstract  class BaseService<T,PK extends Serializable> {
	/**
	 * 日志对象
	 */
	protected Logger logger = LoggerFactory.getLogger(getClass());
	
	/**
	 * 子类实现这个方法，注入实体类
	 * @return
	 */
	public abstract SimpleHibernateDao<T, PK> getEntityDao();
	
	/**
	 * 查询实体
	 * @param id
	 * @return
	 */
	public  T get(Class<T> entityClazz,PK id){
		return getEntityDao().get(entityClazz,id);
	}
	
	/**
	 * 查询实体 
	 * @param id
	 * @return
	 */
	public  T get(Serializable id){
		return getEntityDao().get(id);
	}
	
	public List<T> getAll(){
	  return getEntityDao().getAll();
	}
	
	/**
	 * hql分页查询
	 * @param page
	 * @param hqlString
	 * @param parameters
	 * @return
	 */
	public Page<T> find(Page<T> page, String hqlString, Parameter parameters){
	  return getEntityDao().find(page, hqlString, parameters);
	}
	
	/**
	 * 保存实体
	 * @param entity
	 * @return
	 */
	@Transactional(readOnly=false)
	public Serializable save(T entity){
	    //getEntityDao().clear();
		return getEntityDao().save(entity);
	}
	
	/**
	 * 更新实体
	 * @param entity
	 */
	@Transactional(readOnly=false)
	public void update(T entity){
	  getEntityDao().clear();
	  getEntityDao().update(entity);
	}
	
	/**
	 * 更新多个实体
	 * @param entities
	 */
	@Transactional(readOnly=false)
	public void updateAll(Collection<? extends T> entities){
	  getEntityDao().clear();
	  getEntityDao().udateAll(entities);
	}
	
	/**
	 * 删除实体
	 * @param entity
	 */
	@Transactional(readOnly=false)
	public void delete(T entity){
	  getEntityDao().delete(entity);
	}
	
	/**
	 * 删除多个实体类
	 * @param entities
	 */
	@Transactional(readOnly=false)
	public void deleteAll(Collection<? extends T> entities){
	  getEntityDao().deleteAll(entities);
	}
	
	
}
